package com.example.cpop.controller;

import com.example.cpop.mapper.LoveMusicMapper;
import com.example.cpop.mapper.MusicMapper;
import com.example.cpop.model.Music;
import com.example.cpop.model.User;
import com.example.cpop.tools.Constant;
import com.example.cpop.tools.ResponseBodyMessage;
import org.apache.ibatis.binding.BindingException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: fzykd
 * Date: 2022-10-16
 * Time: 9:31
 */

@RestController
@RequestMapping("/music")
public class MusicController {

    //定义一个固定的保存路径
    //private String SAVE_PATH = "E:/music/";
    //一定要是” / “ Linux系统下才能识别

    //读取配置文件中歌曲保存的目录
    @Value("${music.local.path}")
    //yml配置文件 中间也是用.隔开
    private String SAVE_PATH;


    @Autowired
    private MusicMapper musicMapper;

    @Resource
    private LoveMusicMapper loveMusicMapper;

    @RequestMapping("/upload")
    public ResponseBodyMessage<Boolean> insertMusic(@RequestParam String singer,
                                                    @RequestParam("filename") MultipartFile file,
                                                    HttpServletRequest request,
                                                    HttpServletResponse response) throws IOException {
        //HttpServletRequest request 验证是否登录成功
        //1.通过session检查是否登录成功
        HttpSession httpSession = request.getSession(false);//没有就不创建 有就获取
        if (httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {
            System.out.println("没有登录!");
            return new ResponseBodyMessage<>(-1, "请登录后上传", false);
        }

        //将文件上传到服务器  (熟悉一下操作)
        String fileNameAndType = file.getOriginalFilename();//获取文件名称 ×××.mp3

        System.out.println("fileNameAndType: " + fileNameAndType);

        //将文件上传存到哪里
        String path = SAVE_PATH + fileNameAndType;

        File dest = new File(path);
        //可能dest是不存在的
        if (!dest.exists()) {
            //如果不存在就去创建
            dest.mkdir();
        }
        //如果存在那么就上传
        try {
            file.transferTo(dest);
            //return new ResponseBodyMessage<>(0,"上传成功",true);
        } catch (IOException e) {
            e.printStackTrace();
            return new ResponseBodyMessage<>(-1, "服务器上传失败", false);
        }

        //进行数据库的上传
        //1.准备数据 2.调用insert
        //获取歌名 比如传来的是  越过山丘.mp3 那么存到数据库里应该是 越过山丘
        //只要知道了 .点下标 那么就能正确的存储歌名 subString是前闭后开的形式
        int index = fileNameAndType.lastIndexOf(".");  //找. 的下表 从后往前找 从后往前的第一个点 那么就是分隔符
        String title = fileNameAndType.substring(0, index);

        //获取用户的id
        User user = (User) httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);
        int userid = user.getId();

        //url的作用是播放音乐 实际上是发送的http请求
        String url = "/music/get?path=" + path;

        //年月日 获取的一个规范  HH:mm:ss这个是获取时分秒
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        //将当前的时间 格式化为上面这个样的字符串
        String time = sf.format(new Date());
        System.out.println(time);

        try {
            int ret = 0;
            ret = musicMapper.insert(title, singer, time, url, userid);
            if (ret == 1) {
                //上传成功 本质应该跳转到音乐列表的页面
                response.sendRedirect("/list.html");
                return new ResponseBodyMessage<>(0, "数据库上传成功", true);
            } else {
                return new ResponseBodyMessage<>(-1, "数据库上传失败", false);

            }
        } catch (BindingException e) {
            dest.delete();
            return new ResponseBodyMessage<>(-1, "数据库上传失败", false);
        }

        //歌曲是可以重复上传到数据库的 但是服务器不会有重复的歌曲
        //所以在歌曲上传之前 判断歌名 和 歌手 是否已经在数据中存在同名的
    }

    @RequestMapping("/get")
    public ResponseEntity<byte[]> func(String path) {
        File file = new File(path);
        byte[] a = null;
        try {
            a = Files.readAllBytes(file.toPath());
            if (a == null){
                return ResponseEntity.badRequest().build();
            }
            return ResponseEntity.ok(a); //Entity 安特提 实体
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResponseEntity.badRequest().build();

        //byte[] a = {97,98,99,100};
        //return ResponseEntity.internalServerError().build();
        //return ResponseEntity.notFound().build();
        //调用这个ok方法 会解析byte[] 数组中的内容到body当中
        //return ResponseEntity.ok(a);
    }


    //删除单个音乐
    @RequestMapping("/delete")
    public ResponseBodyMessage<Boolean> deleteMusicById(@RequestParam Integer id){

        //1.先检查音乐是否存在
        Music music = musicMapper.findMusicById(id);
        if (music == null){
            System.out.println("没有这个id");
            return new ResponseBodyMessage<>(-1,"没有你要删除的音乐",false);
        }else {
            //2.如果存在那么就删除音乐  第一删除数据  第二 删除服务器文件
            int ret = musicMapper.deleteMusicById(id);
            if (ret == 1){
                //在删除服务器上的数据
                String title = music.getTitle();
                File file = new File(SAVE_PATH+title+".mp3");
                System.out.println(file.getPath());
                if (file.delete()){
                    //同步删除lovemusic表中的这个音乐
                    loveMusicMapper.deleteLoveMusicByMusicId(id);
                    return new ResponseBodyMessage<>(1,"服务器删除成功",true);

                }else {
                    return new ResponseBodyMessage<>(-1,"服务器删除音乐失败",false);
                }
            }else {
                return new ResponseBodyMessage<>(-1,"数据库中的音乐删除失败",false);

            }
        }
    }

    //进行批量删除
    @RequestMapping("/deletesel")
    public ResponseBodyMessage<Boolean> deleteSelMusic(@RequestParam("id[]") List<Integer> id) {
        System.out.println(id);
        int sum = 0;
        for (int i = 0; i < id.size(); i++) {
            Music music = musicMapper.findMusicById(id.get(i));
            if (music == null) {
                System.out.println("没有这个id");
                return new ResponseBodyMessage<>(-1, "没有你要删除的音乐", false);

            }
            int ret = musicMapper.deleteMusicById(id.get(i));
            if (ret == 1) {
                //在删除服务器上的数据
                String title = music.getTitle();
                File file = new File(SAVE_PATH + title + ".mp3");
                System.out.println(file.getPath());
                if (file.delete()) {
                    //同步删除lovemusic表中的这个音乐
                    loveMusicMapper.deleteLoveMusicByMusicId(id.get(i));
                    sum += ret;
                    // return new ResponseBodyMessage<>(1,"服务器删除成功",true);
                } else {
                    return new ResponseBodyMessage<>(-1, "服务器删除音乐失败", false);
                }
            } else {
                return new ResponseBodyMessage<>(-1, "数据库中的音乐删除失败", false);

            }
        }
        if (sum == id.size()){
            System.out.println("整体删除成功");
            return new ResponseBodyMessage<>(1,"服务器删除成功",true);

        }else {
            System.out.println("整体删除失败");
            return new ResponseBodyMessage<>(-1,"删除音乐失败",false);

        }

    }

    //查询所有音乐
    @RequestMapping("/findmusic")
    public ResponseBodyMessage<List<Music>> funcMusic(@RequestParam(required = false) String musicName){
        List<Music> musicList = null;
        if (musicName != null){
            musicList = musicMapper.findMusicByName(musicName);
        }else {
            musicList = musicMapper.findMusic();
        }
        return new ResponseBodyMessage<>(0,"查询到了所有的音乐",musicList);
    }


}




















